/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;


import Motor.ClaseUtilitaria;
import Motor.Empleado;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;

public class DAOEmpleadoXML
{

    /** variable que contiene la raiz del documento Xml*/
    private Element root;
    /** variable que contiene la localizacion del archivo xml*/
	private String fileLocation = "src//archivo//Empleados.xml";

//    /**
//     * constructor por defecto que inicia los valores para trabajar con el documento
//     * xml
//     */
   public DAOEmpleadoXML()
		   //throws IOException
   {
        try
		{
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

/*Aqui lleno todo el contexto que le voy a insertar al archivo, es decir
    el nodo principal que es Cliente con los atributos que le corresponden,
    los cuales seria cedula,nombre y apellido,etc*/

    private Element EmpleadotoXmlElement(Empleado empleado) throws IOException
	{
        Element raizEmpleado = new Element("empleado");

        Element nombre = new Element("nombre");
        nombre.setText(empleado.getNombre());
		Element apellido = new Element("apellido");
        apellido.setText(empleado.getApellido());
		Element cedula = new Element("cedula");
        cedula.setText(empleado.getCedula());
		Element direccion = new Element("direccion");
        direccion.setText(empleado.getDireccion());
		Element telefono = new Element("telefono");
        telefono.setText(empleado.getTelefono());
//		Element email = new Element("email");
//        email.setText(empleado.getEmail());
		Element sexo = new Element ("sexo");
        sexo.setText(Character.toString(empleado.getSexo()));
		Element login = new Element("login");
        login.setText(empleado.getLogin());
		Element password = new Element("password");
        password.setText(empleado.getPassword());
        Element fechaNacimiento = new Element("fechaNacimiento");
		try {
			fechaNacimiento.setText(ClaseUtilitaria.convertiDateString(empleado.getFechaDeNacimiento()));
		} catch (ParseException ex) {
		}
		Element idEmpleado = new Element("idEmpleado");
		idEmpleado.setText(Integer.toString(empleado.getIdEmpleado()));
		Element rol = new Element("rol");
        rol.setText(empleado.getRol());
		Element numeroCertificadoSalud = new Element("numeroCertificadoSalud");
		numeroCertificadoSalud.setText(Integer.toString(empleado.getNumeroCertificadoSalud()));
		Element sucursal = new Element("sucursal");
        sucursal.setText(empleado.getDepartamento());
		Element fechaIngreso = new Element("fechaIngreso");
		try {
			fechaIngreso.setText(ClaseUtilitaria.convertiDateString(empleado.getFechaDeNacimiento()));
		} catch (ParseException ex) {
			Logger.getLogger(DAOClienteXML.class.getName()).log(Level.SEVERE, null, ex);
		}
		Element sueldo = new Element("sueldo");
		sueldo.setText(Float.toString(empleado.getSueldo()));
//
//	String nombre, String apellido, String cedula, String zonaDondeVive, String telefono,
//	String email, char sexo, String login, String password, Date fechaDeNacimiento, int idEmpleado,
//	String rol, int numeroCertificadoSalud, String departamento, Date fechaIngreso, float sueldo

	raizEmpleado.addContent(nombre);
	raizEmpleado.addContent(apellido);
	raizEmpleado.addContent(cedula);
	raizEmpleado.addContent(direccion);
	raizEmpleado.addContent(telefono);
	//raizEmpleado.addContent(email);
	raizEmpleado.addContent(sexo);
	raizEmpleado.addContent(login);
	raizEmpleado.addContent(password);
	raizEmpleado.addContent(fechaNacimiento);
	raizEmpleado.addContent(idEmpleado);
	raizEmpleado.addContent(rol);
	raizEmpleado.addContent(numeroCertificadoSalud);
	raizEmpleado.addContent(sucursal);
	raizEmpleado.addContent(fechaIngreso);
	raizEmpleado.addContent(sueldo);

	return raizEmpleado;
  }
//
//   /*Método que retorna un Cliente. A este metodo se le manda un Element y con
//    sus datos se hará los pasos requeridos para crear el Cliente*/


	private Empleado EmpleadoToObject (Element element) throws ParseException
	{
		Empleado nuevoEmpleado = new Empleado();

		nuevoEmpleado.setNombre(element.getChildText("nombre"));
		nuevoEmpleado.setApellido(element.getChildText("apellido"));
		nuevoEmpleado.setCedula(element.getChildText("cedula"));
		nuevoEmpleado.setDireccion(element.getChildText("direccion"));
		nuevoEmpleado.setTelefono(element.getChildText("telefono"));
		//nuevoEmpleado.setEmail(element.getChildText("email"));
		nuevoEmpleado.setSexo(element.getChildText("sexo").charAt(0));
		nuevoEmpleado.setLogin(element.getChildText("login"));
		nuevoEmpleado.setPassword(element.getChildText("password"));
		String fechaNacimiento = element.getChildText("fechaNacimiento");
		nuevoEmpleado.setFechaDeNacimiento(ClaseUtilitaria.convertirStringaDate(fechaNacimiento) );
		nuevoEmpleado.setIdEmpleado(Integer.parseInt(element.getChildText("idEmpleado")));
		   // nuevaPersona.setCedula(Integer.parseInt(element.getChildText("cedula")));
		nuevoEmpleado.setRol(element.getChildText("rol"));
		nuevoEmpleado.setNumeroCertificadoSalud(Integer.parseInt(element.getChildText("numeroCertificadoSalud")));
		nuevoEmpleado.setDepartamento(element.getChildText("departamento"));
		String fechaIngreso = element.getChildText("fechaIngreso");
		nuevoEmpleado.setFechaDeNacimiento(ClaseUtilitaria.convertirStringaDate(fechaIngreso) );
		nuevoEmpleado.setSueldo(Float.parseFloat(element.getChildText("sueldo")));


	//	nuevoCliente.setLaTarjeta(tarj.tarjetaDeAfiliadoToObject(element.getChild("tarjetaDeAfiliado")));


    //    clinica.setInventario(inv.InventarioToObject(element.getChild("inventario")));

		// COMO SE CONVIERTE LA LISTA DE FACTURA EN OBJETO ???  <<<<<<<<<<<<<<<----------------------------
// y  la  TARJETA AFILIADO

		return nuevoEmpleado;
	}

   /* Operacion para guardar en el documento Xml los cambios efectuados
    * @return true si se cumplio la operacion con exito, false en caso contrario*/

    private boolean updateDocument()
	{
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

   /* Operacion que busca un elemento que cumpla con una condicion en el id del xml
     * @param raiz = raiz del documento xml
     * @param dato = elemento a buscar.
     * @return retorna el elemento si existe con la condicion, en caso contrario retorna null */



    public static Element buscar(List raiz, String dato)
	{
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedula").getText()))
			{
                return e;
            }
        }
        return null;
    }


//	public boolean verificarRol(List raiz, String usuario)
//	{
//		Iterator i = raiz.iterator();
//		boolean resultado = false;
//        while (i.hasNext())
//		{
//			Element e = (Element) i.next();
//            if (usuario.equals(e.getChild("login").getText()))
//			{
//				System.out.print("entrooo verificar");
//				resultado = true;
//
////				if ("Cajera".equals(e.getChild("rol").getText()))
////					resultado = true;
////				else
////					resultado = false;
//			}
//		}
//        return resultado;
//	}

//   //TODO Por adaptar
//   // @return valor boleano con la condicion de exito

	   public boolean agregarEmpleado(Empleado nEmpleado) throws IOException
	   {
        boolean resultado = false;
		root.addContent(EmpleadotoXmlElement((Empleado) nEmpleado));
        resultado = updateDocument();
        return resultado;
		}

    /* @param cedula numero de cedula del Cliente a buscar
    * @return objeto Cliente con sus datos segun busqueda*/


	   public boolean verificarRol (Integer usuario)
	{

		Element aux = new Element("empleado");
		Empleado empleadoEncontrado;
        List Empleados = this.root.getChildren("empleado"); //aca llamo a mis CLIENTES XML  q esta en archivo?
        while (aux != null)
		{
            aux = DAOEmpleadoXML.buscar(Empleados, Integer.toString(usuario));
            if (aux != null)
			{
                try
				{
					System.out.println("Entro en rol");
					empleadoEncontrado = EmpleadoToObject(aux);
                } catch (ParseException ex)
				{
                    System.out.println(ex.getMessage());
                }
            }
        }

		Iterator i = Empleados.iterator();
		boolean resultado = false;
        while (i.hasNext())
		{
			Element e = (Element) i.next();
            if ("Cajera".equals(e.getChild("login").getText()))
			{
				System.out.print("entrooo verificar ");
				resultado = true;

				if ("Cajera".equals(e.getChild("rol").getText()))
					resultado = true;
				else
					resultado = false;
			}
		}
        return resultado;

	}


	   public Empleado buscarEmpleado(Integer cedula)
	{
        Element aux = new Element("empleado");
        List Empleados = this.root.getChildren("empleado"); //aca llamo a mis CLIENTES XML  q esta en archivo?
        while (aux != null)
		{
            aux = DAOEmpleadoXML.buscar(Empleados, Integer.toString(cedula));
            if (aux != null) {
                try {
					System.out.println("Empleado SI EXISTE");
                    return EmpleadoToObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
			return null;
    }


//    /* @param Estudiante objeto Estudiante a actualizar
//     * @return valor boleano con la condicion de exito */

//    public boolean actualizarPaciente(Paciente nPaciente) {
//        boolean resultado = false;
//        Element aux = new Element("paciente");
//        List Pacientes = this.root.getChildren("paciente");
//        while (aux != null) {
//            aux = DAOPacienteXML.buscar(Pacientes, Integer.toString(nPaciente.getCedula()));
//            if (aux != null) {
//                Pacientes.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        agregarPaciente(nPaciente);
//        return resultado;
//    }
//
//    //TODO Por adaptar
//
    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
    public boolean borrarEmpleado(Integer cedula)
	{
        boolean resultado = false;
        Element aux = new Element("empleado");
        List Empleados = this.root.getChildren("empleado");
        while (aux != null) {
            aux = DAOEmpleadoXML.buscar(Empleados, Integer.toString(cedula));
            if (aux != null) {
                Empleados.remove(aux);
                resultado = updateDocument();
            }
        }
        return resultado;
    }

//    //TODO Por adaptar
//
    /* Para obtener todos los Clientes
     * @return ArrayList con todos los objetos Cliente  */
	public static Element buscar(List raiz, String dato, String dato2) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("login").getText()) &&
                dato2.equals(e.getChild("password").getText())) {
                return e;
            }
        }
        return null;
    }

	public Empleado buscarEmpleadoLogin(String usuario, String contrasena) {
        Element aux = new Element("empleado");
        List Empleados = this.root.getChildren("empleado");
        while (aux != null){
            aux = DAOEmpleadoXML.buscar(Empleados, usuario, contrasena);
            if (aux != null) {
                try {
                    return EmpleadoToObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

    public ArrayList<Empleado> todosLosEmpleados()
	{
        ArrayList<Empleado> resultado = new ArrayList<Empleado>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(EmpleadoToObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}
